/*!
 * \file module_comm.h
 *
 * \brief 模块公用结构体
 *
 * \version 2.0
 * \author yaohl
 * \date 2014/10/31
 *
 * 模块通信公用结构体
 *
 */

#ifndef __MODULE_COMM_H_
#define __MODULE_COMM_H_

#include "frmem.h"
#include "frstr.h"
#include "frhashmap_varfield.h"

/*! @brief  端口范围 */
typedef struct __st_port_range {
    u_short us_port_start;
    u_short us_port_end;
} frport_range;

/*! @brief 连接状态 */
typedef enum __em_analyz_cmd
{
    FRANALYZ_CMD_SYN = 1,
    FRANALYZ_CMD_FIN ,
    FRANALYZ_CMD_DATA,
    FRANALYZ_CMD_RESET,
    FRANALYZ_CMD_UNKNOWN,
} Franalyz_cmd;

/*! @brief 协议分析入力数据 */
typedef struct __st_analyze_data {
    int i_direction;                /*!< 当前数据方向 */
    u_int src_ip, dst_ip;           /*!< 实际数据包的ip,并不是ct上固定的ip */
    u_short src_port, dst_port;     /*!< 实际数据包的port,并不是ct上固定的port */
    struct timeval st_timestamp;    /*!< 数据包发生时间 */

    Franalyz_cmd em_analyz_cmd;     /*!< FRANALYZ_CMD_FIN FRANALYZ_CMD_DATA */
    char *p_payload;                /*!< 数据包内容，可以为空 */
    unsigned int ui_payload_len;    /*!< 数据包长度 */

    int i_l7_proto;                 /*!< L7层模块代号 */
    u_short us_is_detected;         /*!< FR_NO:协议没有检查过; FR_YES:该数据包协议检查过 */
} Apm_packet;

typedef struct __st_l7_module L7_module;

/*! @brief 连接中l7信息 */
typedef struct __st_L7_transaction {
    int  i_status;              /*!< 某个请求正在请求中APM_L7_IN_PROGRESS */
    char *p_transaction_code;   /*!< 交易码，一般从request中提取。NULL表示没有 */
    char *p_transaction_title;  /*!< 标识符。NULL表示没有 */
    char *p_server_name;        /*!< 检查到的服务器名称，如Apache 2.0 */
    int  i_batch_count;         /*!< 批处理长度，默认为1 */

    char *p_request_xml_fields;     /*!< XML输出结果，如果传统的KV结构无法表述时可选用XML表达，按XML规范存储 */
    char *p_request_json_fields;    /*!< json数据 */

    char *p_response_xml_fields;    /*!< XML输出结果，如果传统的KV结构无法表述时可选用XML表达，按XML规范存储 */
    char *p_response_json_fields;   /*!< json数据 */

    /*
    *  应答的状态码有多个，例如在HTTP之上承载的XML协议，用户可能在XML中定义了请求的最终应答状态，
    *  所以，状态码应以能识别的最上层协议的为准
    */
    long  l_response_code;          /*!< 应答的状态码，存放数值  */
    char *p_response_codestring;    /*!< 应答的状态码串，如HTTP的 200 OK */
    //char *p_response_status;      /*!< 应答的状态码, 如影响多少行数据 */
} L7_transaction;


/*! @brief 连接中l4信息 */
typedef struct __st_L4_transaction {
    /* 请求和应答相关的时间、数据 */
    struct timeval st_request_time_first_byte; /*!< 请求发起的第一个数据包时间 */
    struct timeval st_request_time_start;      /*!< 请求数据第一个分片包发送的时间 */
    struct timeval st_request_time;            /*!< 所有请求数据发送完的时间 */
    long   l_request_bytes;                    /*!< 请求字节数，in bytes */

    struct timeval st_response_time_first_byte; /*!< 收到第一个应答包时间 */
    struct timeval st_response_time;            /*!< 所有应答包数据接收完的时间 */
    long   l_response_bytes;                    /*!< 应答的字节数， in bytes */

    unsigned long ul_response_time_firstbyte_us;/*!< 首包时间，是指从请求发起到收到第一个应答包时间，使用微秒表示 */
    unsigned long ul_response_time_us;          /*!< 应答时间，是指从请求发起到所有应答结束总花费的时间，使用微秒表示 */
} L4_transaction;


#endif

